package com.tengju.user.infrastructure.persistence.mybatis.mapper.dealer.custom;

import com.tengju.user.domain.model.sign.StarAuditStatEnum;
import com.tengju.user.domain.model.sign.StarSignStepEnum;
import com.tengju.user.domain.model.user.UserIdCode;
import com.tengju.user.infrastructure.persistence.mybatis.dataobject.SignStatisticsDetailDO;
import com.tengju.user.infrastructure.persistence.mybatis.dataobject.StarSignInfoDO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author chenhang
 */
public interface StarSignInfoDOCustomMapper {

    StarSignInfoDO selectByIdCodeNotStep(@Param("idCode") Long idCode,@Param("steps") List<StarSignStepEnum> notSteps);

    StarSignInfoDO selectByIdCodeBeforeLevelNotStep(@Param("idCode") Long idCode, @Param("beforeStarLevel") Integer beforeStarLevel, @Param("steps") List<StarSignStepEnum> notSteps);

    StarSignInfoDO selectByIdCode(@Param("idCode") Long idCode);

    StarSignInfoDO selectById(@Param("id") Long id);

    List<StarSignInfoDO> selectAllByIdCode(@Param("idCode") Long idCode);

    List<StarSignInfoDO> batchGetByIdCodes(@Param("idCodeList") List<Long> idCodes);

    List<StarSignInfoDO> selectSignStatusByIdCode(@Param("idCodeList") List<Long> idCodes);

    List<StarSignInfoDO> batchGetByIdCodesStepAuditStat(@Param("idCodeList") List<UserIdCode> idCodes,
                                                        @Param("steps") List<StarSignStepEnum> steps,
                                                        @Param("auditStatus") StarAuditStatEnum auditStatus);

    List<StarSignInfoDO> batchGetByIds(@Param("idList") List<Long> idList);

    List<StarSignInfoDO> getHistoryByIdCode(Long idCode);

    List<StarSignInfoDO> listStarSignInfoByClause(@Param("auditDesc") String auditDesc,
                                                @Param("auditStatus") StarAuditStatEnum auditStatus,
                                                @Param("steps") List<StarSignStepEnum> steps,
                                                @Param("handleType") Byte handleType,
                                                @Param("originStarLevel") Integer originStarLevel,
                                                @Param("targetStarLevel") Integer targetStarLevel,
                                                @Param("blackListFlag") Byte blackListFlag,
                                                @Param("offset") Integer offset,
                                                @Param("limit") Integer pageSize);

    Integer countStarSignInfoByClause(@Param("auditDesc") String auditDesc,
                                                @Param("auditStatus") StarAuditStatEnum auditStatus,
                                                @Param("steps") List<StarSignStepEnum> steps,
                                                @Param("handleType") Byte handleType,
                                                @Param("originStarLevel") Integer originStarLevel,
                                                @Param("targetStarLevel") Integer targetStarLevel,
                                                @Param("blackListFlag") Byte blackListFlag,
                                                @Param("offset") Integer offset,
                                                @Param("limit") Integer pageSize);

    List<Long> listAllUserByClause(@Param("idCode") Long queryIdCode,
                                   @Param("mobile") String mobile,
                                   @Param("nickName") String nickName,
                                   @Param("starLevel") Integer starLevel,
                                   @Param("agreementStatus") Byte agreementStatus,
                                   @Param("agreementFromDate") LocalDateTime agreementFromDate,
                                   @Param("agreementEndDate") LocalDateTime agreementEndDate,
                                   @Param("blackListFlag") Byte blackListFlag,
                                   @Param("offset") Integer offset,
                                   @Param("limit") Integer pageSize);

    Integer countAllUserByClause(@Param("idCode") Long queryIdCode,
                                   @Param("mobile") String mobile,
                                   @Param("nickName") String nickName,
                                   @Param("starLevel") Integer starLevel,
                                   @Param("agreementStatus") Byte agreementStatus,
                                   @Param("agreementFromDate") LocalDateTime agreementFromDate,
                                   @Param("agreementEndDate") LocalDateTime agreementEndDate,
                                   @Param("blackListFlag") Byte blackListFlag,
                                   @Param("offset") Integer offset,
                                   @Param("pageSize") Integer pageSize);

    Integer countStep(@Param("step") int step);

    List<StarSignInfoDO> listStep(@Param("step") int step, @Param("startId") long startId,  @Param("limit") int limit);


    Integer countExpireRecord(@Param("expireDate") LocalDateTime expireDate);

    List<StarSignInfoDO> listExpireRecord(@Param("expireDate") LocalDateTime expireDate, @Param("limit") int limit);

    int casUpdateByPrimaryKeySelective(@Param("starSignInfoDO") StarSignInfoDO starSignInfoDO, @Param("curStep") Integer curStep);

    List<SignStatisticsDetailDO> listSignStatisticsDetail(@Param("lastMonth") Integer lastMonth,
                                                          @Param("thisMonth") Integer thisMonth);

}
